实验环境
windows 10
vscode
frida 16.2.1
jadx-gui
Frida相关api介绍
1.Process、Module、Memory基础
1.Process
Process
对象代表当前被Hook的进程,能获取进程的信息,枚举模块,枚举范围等
API | 含义 |
---|---|
Process.id |
返回附加目标进程的 PID |
Process.isDebuggerAttached() |
检测当前是否对目标程序已经附加 |
Process.enumerateModules() |
枚举当前加载的模块,返回模块对象的数组 |
Process.enumerateThreads() |
枚举当前所有的线程,返回包含 id , state , context 等属性的对象数组 |
### 2.Module | |
Module 对象代表一个加载到进程的模块(例如,在 Windows 上的 DLL,或在 Linux/Android 上的 .so 文件),能查询模块的信息,如模块的基址、名称、导入/导出的函数等 |
API | 含义 |
---|---|
Module.load() |
加载指定so文件,返回一个Module对象 |
enumerateImports() |
枚举所有Import库函数,返回Module数组对象 |
enumerateExports() |
枚举所有Export库函数,返回Module数组对象 |
enumerateSymbols() |
枚举所有Symbol库函数,返回Module数组对象 |
Module.findExportByName(exportName)、Module.getExportByName(exportName) |
寻找指定so中export库中的函数地址 |
Module.findBaseAddress(name)、Module.getBaseAddress(name) |
返回so的基地址 |
3.Memory
Memory
是一个工具对象,提供直接读取和修改进程内存的功能,能够读取特定地址的值、写入数据、分配内存等
方法 | 功能 |
---|---|
Memory.copy() |
复制内存 |
Memory.scan() |
搜索内存中特定模式的数据 |
Memory.scanSync() |
同上,但返回多个匹配的数据 |
Memory.alloc() |
在目标进程的堆上申请指定大小的内存,返回一个NativePointer |
Memory.writeByteArray() |
将字节数组写入一个指定内存 |
Memory.readByteArray |
读取内存 |
2.枚举导入导出表
- 导出表(Export Table):列出了库中可以被其他程序或库访问的所有公开函数和符号的名称。
- 导入表(Import Table):列出了库需要从其他库中调用的函数和符号的名称。
简而言之,导出表告诉其他程序:“这些是我提供的功能。”,而导入表则表示:“这些是我需要的功能。”。
1 | function hookTest1(){ |
3.Native函数的基础Hook打印
- 整数型、布尔值类型、char类型
1 | function hookTest2(){ |
- 字符串类型
1 | function hookTest2(){ |
4.Native函数的基础Hook修改
- 整数型修改
1 | function hookTest3(){ |
- 字符串类型修改
1 | function hookTest2(){ |
5.SO基址的获取方式
1 | var moduleAddr1 = Process.findModuleByName("lib52pojie.so").base; |
6.Hook未导出函数与函数地址计算
1 | function hookTest6(){ |
函数地址计算
安卓里一般32 位的 so 中都是
thumb
指令,64 位的 so 中都是arm
指令通过IDA里的opcode bytes来判断,arm 指令为 4 个字节(options -> general -> Number of opcode bytes (non-graph) 输入4)
thumb 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移 + 1
arm 指令,函数地址计算方式: so 基址 + 函数在 so 中的偏移7.Hook_dlopen
1 | function hook_dlopen() { |
8.借助IDA脚本实现一键式hook
通过MyIDAFrida直接生成,默认应该只适用于attach模式
粘贴到文件,之后也是通过的方式启动
1 | frida -U wuaipojie -l .\idahook.js |
java层hook对应
- 通过java层修改
1 | //定义一个名为hookTest1的函数 |
- 通过hook java层
1 | function hookTest2(){ |